function YcPromise(constructor) {
    this.status = 'pending'
    this.result = undefined
    //定义收集器为一个数组，当实例每调用一次then时，都会在手收集器中存入存有successCB和failCB函数的对象，为实例和then方法多次调用提供条件
    this.collector = []
    const resolve = (res) => {
        //凝固状态，当状态发生过一次改变之后，就不会再执行以下内容了
        if (this.status !== 'pending') return;
        this.status = 'fulfilled'
        this.result = res
        //异步操作时执行收集器内的函数
        this.collector.forEach(item => {
            //与逻辑短路运算的应用
            item.successCB && item.successCB()
        })
    }
    const reject = (err) => {
        if (this.status !== 'pending') return;
        this.status = 'rejected'
        this.result = err
        //异步操作时执行收集器内的函数
        this.collector.forEach(item => {
            item.failCB && item.failCB()
        })
    }
    constructor(resolve, reject)
}
//判断当前返回值是否是YcPromise的一个实例
function isYcPromise(returnValue, resolve, reject) {
    if (returnValue instanceof YcPromise) {
        returnValue.then(res => {
            resolve(res)
        }, err => {
            reject(err)
        })
    } else {
        resolve(returnValue)
    }
}

YcPromise.prototype.then = function (successCB, failCB) {
    return new YcPromise((resolve, reject) => {
        if (this.status === 'fulfilled') {
            //与运算符的短路运算，当左边的为假时，会立即返回false并停止执行后面的内容
            const returnValue = successCB && successCB(this.result)
            isYcPromise(returnValue, resolve, reject)
        }
        if (this.status === 'rejected') {
            const returnValue = failCB && failCB(this.result)
            isYcPromise(returnValue, resolve, reject)
        }
        /* 当当前操作为异步操作时，当前实例状态依然为pending,这时我们将传递过来的函数收集到当前实例的收集器中，当resolve或者reject方法执行的时候，再调用收集器内的函数，这样就可以解决异步问题了 */
        if (this.status === 'pending') {
            //收集器
            this.collector.push({
                successCB: () => {
                    const returnValue = successCB && successCB(this.result)
                    isYcPromise(returnValue, resolve, reject)
                },
                failCB: () => {
                    const returnValue = failCB && failCB(this.result)
                    isYcPromise(returnValue, resolve, reject)
                }
            })
        }
    })
}

YcPromise.prototype.catch=function(){

}